// 上传图片接口url
const smallProgram = require('../config').smallProgram
/**
 * 扩展类
 * @param target object (必需)
 */
function extend(target, sources) {
  var sources = Array.prototype.slice.call(arguments, 1);
  for (var i = 0; i < sources.length; i += 1) {
    var source = sources[i];
    for (var key in source) {
      if (source.hasOwnProperty(key)) {
        target[key] = source[key];
      }
    }
  }
  return target
}
/**
 * 判断数据类型
 * @param obj 数据类型 （必需）
 * return string  可能的值："Object", "Array","Boolean","Date", "Number", "RegExp", "String", "Window",       "HTMLDocument"
 */
function mType (obj){
  // 判断为null时返回'null',为undefined时返回'undefined'
  if (obj == null) {
    return obj + ""
  }

  var str = Object.prototype.toString.call(obj)
  if (str === '[object Object]'){
    return 'Object'
  } else if (str === '[object Array]'){
    return 'Array'
  } else if (str === '[object Boolean]'){
    return 'Boolean'
  } else if (str === '[object Date]') {
    return 'Date'
  } else if (str === '[object Number]') {
    return 'Number'
  }
  else if (str === '[object RegExp]') {
    return 'RegExp'
  }
  else if (str === '[object String]') {
    return 'String'
  }
  else if (str === '[object Window]') {
    return 'Window'
  }
  else if (str === '[object HTMLDocument]') {
    return 'HTMLDocument'
  } else {

  }
}
/**
 * 判断对象是否为空函数
 * @param obj object 对象
 */
function isEmptyObject( obj) {
  var name
  for (name in obj) {
    return false
  }
  return true
}
/**
 * 判断是否是函数
 * @param fun function
 */
function isFunction(fun) {
  return mType(fun) === "function"
}
/**
 * 判断是否是数字
 * @param obj 
 */
function isNumeric( obj) {
  var xType = mType(obj)
  return (xType === "number" || xType === "string") && !isNaN(obj - parseFloat(obj))
}
/**
 * 时间格式化
 * @param date object  Date对象(必需)
 */
function formatTime (date) {
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const hour = date.getHours()
  const minute = date.getMinutes()
  const second = date.getSeconds()

  return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}
/**
 * wx.request 包装
 * @param options object 参数对象
 *                url   string  ajax地址(必需)
 *                data  object  ajax参数
 *                header object ajax头部
 *                method string ajax方式
 *                dataType sting ajax的dataType
 *                success function ajax成功回调(必需)
 *                fail  function ajax失败回调
 *                complete function ajax完成回调
 */
function XHR (options) {
  if (!options.url) {
    console.log('调用XHR函数时url参数必需！')
  }

  var url = options.url
  var data = {}
  var header = {'content-type': 'application/json','Cookie': 'third_session=' + wx.getStorageSync('SESSION_KEY')}
  var method = options.method || 'POST'
  var dataType = options.dataType || 'json'

  data = extend(data, options.data)
  header = extend(header, options.header)
  wx.request({
    url: url,
    method: method,
    data: data,
    header: header,
    success: function (res) {
      if (res.data.code === 1) {
        options.success && options.success(res.data.t)
      } else if (res.data.code === 2103) {// 
        // sessioin_key过期(即token失效 或者错误)，重新登录
        wx.removeStorageSync('SESSION_KEY')
        getApp().isLogin({
          success: function(){
            // 重新登录后刷新页面
            var url = getCurrentPageUrlWithArgs()
            console.log(url)
            if(!url || (url === '/pages/index/index')) {
              wx.reLaunch({
                url: '/pages/index/index'
              })
            // } else if((url === '/pages/map/map') || (url === 'pages/mine/mine')){
            //   wx.reLaunch({
            //     url: '/pages/index/index'
            //   })
            } else {
              wx.redirectTo({
                url: url
              })
            }
          }
        })
      } else if (res.data.code === 2102  ) { 
        // 用户不存在，请重新登录
        wx.removeStorageSync('SESSION_MOBILE')
        wx.removeStorageSync('SESSION_KEY')
        getApp().isLogin()
      } else if (res.data.code === 2104){
        // 用户冻结（异常）
        alertMsg({
          content: '账户异常，请联系平台客服人员咨询！',
          success: function(){
            wx.removeStorageSync('SESSION_MOBILE')
            wx.removeStorageSync('SESSION_KEY')
            getApp().isLogin()
          }
        })
      } else {
        console.log(res)
        if(options.fail){
          options.fail(res.data)
        } else {
          alertMsg('系统繁忙')
        }
      }
    },
    fail: function (error) {
      alertMsg('您的网络可能有问题，请检查网络！')
    },
    complete: function () {
      options.complete && options.complete()
    }
  })
}
/**
 * 检验数字
 * @param num number 数字
 */
function formatNumber (num) {
  num = num.toString()
  return num[1] ? num : '0' + num
}
/**
 * 检验电话号码
 * @param phone string 电话号码
 */
function checkPhone (phone) {
  if (!(/^1[34578]\d{9}$/.test(phone))) {
    return false;
  }
  return true
}
/**
 * 检验钱币
 * @param money number 钱币
 */
function checkMoney (money) {
  if (!(/(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/.test(money))) {
    return false;
  }
  return true
}
/**
 * 清除字符两端的空白字符
 * @param str string 清除字符串两端空格
 */
function trim (str) {
  return str.replace(/(^\s*)|(\s*$)/g, "")
}
/**
 * 获取当前页url
 */
function getCurrentPageUrl () {
  var pages = getCurrentPages()    //获取加载的页面
  var currentPage = pages[pages.length - 1]    //获取当前页面的对象
  var url = '/' + currentPage.route    //当前页面url
  return url
}
/**
 * 获取当前页带参数的url
 */
function getCurrentPageUrlWithArgs () {
  var pages = getCurrentPages()    //获取加载的页面
  if(pages.length === 0) {
    return null
  }
  var currentPage = pages[pages.length - 1]    //获取当前页面的对象
  var url = '/' + currentPage.route    //当前页面url
  var options = currentPage.options    //如果要获取url中所带的参数可以查看options

  //拼接url的参数
  var urlWithArgs = url + '?'
  for (var key in options) {
    var value = options[key]
    urlWithArgs += key + '=' + value + '&'
  }
  urlWithArgs = urlWithArgs.substring(0, urlWithArgs.length - 1)

  return urlWithArgs
}
/**
 * 修改前一页data数据
 * @param obj object 对象
*/
function editPrevPageData (obj){
  var pagesArr = getCurrentPages()
  var length = pagesArr.length
  if(length >= 2){
    pagesArr[length - 2].setData(obj)
  }
}
/**
 * 获取前一页data对象里面对应的属性值
 * @param param string  字符串
*/
function getPrevPageData(param) {
  var pagesArr = getCurrentPages()
  var length = pagesArr.length
  if (length >= 2) {
    return pagesArr[length - 2].data[param]
  }
}
/**
 * 调用前一页函数
 * @param fun function 函数名称
 */
function callPrevPageFun(fun){
  var pagesArr = getCurrentPages()
  var length = pagesArr.length
  if (length >= 2) {
    pagesArr[length - 2][fun]()
  }
}
/**
 * 浮点数加
 */
function add (a, b) {
  var c, d, e;
  try {
    c = a.toString().split(".")[1].length;
  } catch (f) {
    c = 0;
  }
  try {
    d = b.toString().split(".")[1].length;
  } catch (f) {
    d = 0;
  }
  return e = Math.pow(10, Math.max(c, d)), (mul(a, e) + mul(b, e)) / e;
}
/**
 * 浮点数减
 */
function sub (a, b) {
  var c, d, e;
  try {
    c = a.toString().split(".")[1].length;
  } catch (f) {
    c = 0;
  }
  try {
    d = b.toString().split(".")[1].length;
  } catch (f) {
    d = 0;
  }
  return e = Math.pow(10, Math.max(c, d)), (mul(a, e) - mul(b, e)) / e;
}
/**
 * 浮点数乘
 */
function mul (a, b) {
  var c = 0,
    d = a.toString(),
    e = b.toString();
  try {
    c += d.split(".")[1].length;
  } catch (f) { }
  try {
    c += e.split(".")[1].length;
  } catch (f) { }
  return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
}
/**
 * 浮点数除
 */
function div (a, b) {
  var c, d, e = 0,
    f = 0;
  try {
    e = a.toString().split(".")[1].length;
  } catch (g) { }
  try {
    f = b.toString().split(".")[1].length;
  } catch (g) { }
  return c = Number(a.toString().replace(".", "")), d = Number(b.toString().replace(".", "")), mul(c / d, Math.pow(10, f - e));
}
/**
 * 上传图片
 * @param obj object 参数对象
 *            filePath array 保存虚拟地址数组(必需)
 *            formData object  ajax中data
 *            success function 上传成功回调函数
 */
function uploadPics (obj){
  var successUp = 0; //成功个数
  var failUp = 0; //失败个数
  var length = obj.filePath.length; //总共个数
  var i = 0; //第几个
  var filesArr = [] // 保存图片
  var header = {
                  'Content-Type': 'multipart/form-data',
                  'Cookie': 'third_session=' + wx.getStorageSync('SESSION_KEY')
               }

  showLoading('上传图片中···')
  uploadPic() 
  function uploadPic(){
    wx.uploadFile({
      url: smallProgram,
      filePath: obj.filePath[i],
      name: 'image',
      header: header,
      formData: obj.formData,
      success: function (res) {
        console.log(res)
        if (res.statusCode === 200){
          var data = JSON.parse(res.data)
          if (data.code === 200 && data.t != null) {
            successUp++

            var file = {}
            file.domainName = data.t.domainName
            file.path = data.t.images[0]
            filesArr.push(file)
          } else if (data.code === 203) {
            console.log(res)
            failUp++

            // 阻止上传
            i = length

            // sessioin_key过期，重新登录
            wx.removeStorageSync('SESSION_KEY')
            getApp().isLogin({
              success: function () {
                // 重新登录后刷新页面
                var url = getCurrentPageUrlWithArgs()
                if (!url || (url === '/pages/index/index')) {
                  wx.reLaunch({
                    url: '/pages/index/index'
                  })
                } else if ((url === '/pages/map/map') || (url === 'pages/mine/mine')) {
                  wx.reLaunch({
                    url: '/pages/index/index'
                  })
                } else {
                  wx.redirectTo({
                    url: url
                  })
                }
              }
            })
          } else if (data.code === 202) {
            console.log(res)
            failUp++

            // 阻止上传
            i = length

            // 用户不存在，请重新登录
            wx.removeStorageSync('SESSION_MOBILE')
            wx.removeStorageSync('SESSION_KEY')
            getApp().isLogin()
          } else {
            console.log(res)
            failUp++

            alertMsg('系统繁忙！')
          }
        } else {
          failUp++;
          console.log(res)
        }
      },
      fail: function (res) {
        failUp++;
        console.log(res)
      },
      complete: function (res) {
        hideLoading()

        i++
        if (i === length) {
          if ((length === 1) && (successUp === 1)){
            alertMsg('上传成功！')
            obj.success(filesArr)
          } else if ((length === 1) && (successUp === 0)){
            alertMsg('上传失败！')
          } else {
            alertMsg({
              content: '总共' + successUp + '张上传成功,' + failUp + '张上传失败！',
              success: function () {
                obj.success(filesArr)
              }
            })
          }
        }
        else {
          uploadPic()
        }
      }
    })
  }
}
/**
 * 检查支付密码
 * @param payPwd string
 */
function checkPayPwd(payPwd) {
  var str = trim(payPwd)
  if (str == null || str.length < 6) {
    return false
  }
  var reg = new RegExp(/^\d{6}$/);
  if (reg.test(str)) {
    return true
  } else {
    return false
  }
}  
/**
 * 密码校验（检验最少8位，包含字符和数字）
 * @param pwd string 密码(必需)
 */
function checkPwd (pwd) {
  var str = trim(pwd)
  if (str == null || str.length < 8) {
    return false
  }
  var reg = new RegExp(/^(?![^a-zA-Z]+$)(?!\D+$)/);
  if (reg.test(str)){
    return true
  } else {
    return false
  }
}
/**
 * 显示加载提示
 * @param desci string  加载提示语(必需)
 */
function showLoading(desci){
  if (!desci) {
    console.log('调用showLoading函数时desci参数必需！')
  }

  wx.showLoading({
    title: desci,
    mask: true
  })
}
/**
 * 隐藏加载提示
 */
function hideLoading(){
  wx.hideLoading()
}
/**
 * 信息提示框（不含取消按钮）
 * @param options object 参数对象
 *                title string 标题
 *                content string 描述(必需)
 *                success function 隐藏后的回调函数
 */
function alertMsg(options){
  var mOptions = {
    title: '温馨提示',
    content: '描述',
    success: function(){}
  }

  if(mType(options) === 'String'){
    mOptions.content = options
  } else {
    mOptions = extend(mOptions, options)
  }

  wx.showModal({
    cancelColor: '#aaa',
    confirmColor: '#262626',
    title: mOptions.title,
    content: mOptions.content,
    showCancel: false,
    success: function (res) {
      if (res.confirm) {
        mOptions.success()
      }
    }
  })
}
/**
 * 确认提示框
 * @param options object 参数对象
 *                title string 标题
 *                content string 描述 （必需）
 *                success function 点击确定回调函数
 *                fail function 点击取消回调函数
 */
function confirmMsg(options) {
  var mOptions = {
    title: '温馨提示',
    content: '',
    confirmText: '确定',
    success: function () {console.log('点击确定') },
    fail: function () { console.log('点击确定')}
  }

  if (mType(options) === 'String') {
    mOptions.content = options
  } else {
    mOptions = extend(mOptions, options)
  }

  wx.showModal({
    cancelColor: '#aaa',
    confirmColor: '#262626',
    confirmText: mOptions.confirmText,
    title: mOptions.title || '温馨提示',
    content: mOptions.content,
    success: function (res) {
      if (res.confirm) {
        mOptions.success && mOptions.success()
      } else {
        mOptions.fail && mOptions.fail()
      }
    }
  })
}

module.exports = {
  extend: extend, // 扩展对象
  formatTime: formatTime, // 格式化时间
  XHR: XHR, // Ajax异步加载数据
  formatNumber: formatNumber, // 校验数字
  checkPhone: checkPhone, // 验证手机号
  checkMoney: checkMoney, // 验证钱币
  trim: trim, // 去除字符串两端空白
  getCurrentPageUrl: getCurrentPageUrl, // 获取当前url
  getCurrentPageUrlWithArgs: getCurrentPageUrlWithArgs, // 获取当前url里面带的参数
  editPrevPageData: editPrevPageData, // 修改前一页data数据
  add: add, // 浮点数加
  sub: sub, // 浮点数减
  mul: mul, // 浮点数乘
  div: div, // 浮点数除
  uploadPics: uploadPics, // 上传图片
  checkPwd: checkPwd, // 校验密码
  showLoading: showLoading, // 显示加载提示
  hideLoading: hideLoading, // 隐藏加载提示
  alertMsg: alertMsg, // 提示框（不含取消按钮）
  confirmMsg: confirmMsg, // 确认提示款
  mType: mType, // 判断数据类型
  isEmptyObject: isEmptyObject, // 判断数据是否为空对象
  isFunction: isFunction, // 判断是否是函数
  isNumeric: isNumeric, // 判断是否是数字
  callPrevPageFun: callPrevPageFun, // 调用前一页函数
  checkPayPwd: checkPayPwd, // 检查支付密码
  getPrevPageData: getPrevPageData, // 获取前一页data对象里面对应的属性值
}